package com.xinyue.design.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理模式
 * 代理模式的本质：控制对象访问。
 * Java动态代理通过反射机制，在访问方法的时候对其访问条件进行判断，在访问后对其访问结果进行处理。
 * 动态代理只有一个invoke入口，所有对被代理对象方法的访问都通过这个入口进入。
 * 故针对不同的方法，必须在invoke中判断。静态代理无此问题。
 * 
 * 动态代理在被代理类的接口发生改变的时候，本身可以无改动或者改动很小。静态代理则必须修改所有代理类和被代理类。
 */
public class DynamicProxy implements InvocationHandler{

	private OpProxy op = null;
	
	/**
	 * 装载代理对象
	 * @param op
	 */
	public DynamicProxy(Operater op) {
		this.op = op;
	}
	/**
	 * 将代理对象和代理接口联系起来
	 * @return
	 */
	public OpProxy getProxyInterface() {
		return (OpProxy) Proxy.newProxyInstance(op.getClass().getClassLoader(), op.getClass().getInterfaces(), this);
	}
	
	/**
	 * 代理方法
	 * 通过反射技术，Proxy会对每一个类中的方法进行排查
	 */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		System.out.println("begin");
		Object obj = method.invoke(op, args);
		System.out.println("end");
		return obj;
	}

}
